/*******************************************************************/
/* @ All Rights Reserved Copyright (C) 2014 broada,Co.,Ltd.        */
/*                                                                 */
/*  NAME      = frlua_config.h                                     */
/*  NOTE      =                                                    */
/*  DATE      = 2015/06/17 by guojq                                */
/*******************************************************************/

#ifndef __FRLUA_CONFIG_H_
#define __FRLUA_CONFIG_H_

#if defined(FRLINUX4) || defined(FRLINUX5)
    extern "C"{
    #include <lua.h>
    }
#else
    #ifdef LIB_APM_LUAJIT
    #include <luajit-2.0/lua.hpp>
    #else
    #include <lua.hpp>
    #endif
#endif

typedef struct __lua_info {
    u_int       ip;
    u_short     port_start;
    u_short     port_end;
    //int         proto_l7;
    char        *p_file;            /* 使用时需要加锁 splock */
    char        *p_lua;             /* 使用时需要加锁 splock */

    lua_State   *p_lua_handle;      /* 使用时需要加锁 splock */
    pthread_spinlock_t splock;

    unsigned long refcnt;           /* flg_del==1 && refcnt==0,删除该节点 */
    short       flg_del;            /* 0以外:该节点可以删除;0:不可以删除 */
} Lua_cfg;

void frlua_read_lock(void);
void frlua_read_unlock(void);

int frlua_config_load(void);
int frlua_config_add(u_int ui_ip, const char *p_port, const char *p_lua, char **pp_result);
int frlua_config_del(u_int ui_ip, const char *p_port, char **pp_result);
int frlua_config_clear(char **pp_result);
int do_lua_commit(char **pp_result);
int do_lua_rollback(void);

Lua_cfg* frlua_config_lookup(u_int ui_ip, u_short us_port);
void frlua_config_put(Lua_cfg *p_lua_cfg);
unsigned long frlua_config_version(void);

void frlua_chk_del();
int frlua_clear_all(char **pp_result);

int frlua_config_init(void);
void frlua_config_destroy(void);

#endif
